package com.kexio.dynamic.datasource.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 强制从库注解
 * 
 * 标记在方法或类上，强制使用从库（读库）
 * 
 * 使用示例：
 * <pre>
 * &#64;Slave
 * public List&lt;User&gt; queryUsers() {
 *     // 这个方法强制使用从库
 * }
 * 
 * &#64;Slave
 * public Page&lt;Order&gt; getOrderHistory(Long userId, Pageable pageable) {
 *     // 历史查询，使用从库
 * }
 * 
 * &#64;Slave(loadBalance = true)
 * public List&lt;Report&gt; generateReport() {
 *     // 报表查询，使用从库负载均衡
 * }
 * </pre>
 * 
 * @author Kexio
 * @since 1.0.0
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@DS(type = DS.DSType.SLAVE, readOnly = true, force = true)
public @interface Slave {

    /**
     * 是否启用负载均衡
     * 当有多个从库时，是否自动负载均衡
     */
    boolean loadBalance() default true;

    /**
     * 从库选择策略
     */
    LoadBalanceStrategy strategy() default LoadBalanceStrategy.ROUND_ROBIN;

    /**
     * 描述信息
     */
    String description() default "强制使用从库";

    /**
     * 失败策略
     */
    DS.FailureStrategy onFailure() default DS.FailureStrategy.FALLBACK_TO_DEFAULT;

    /**
     * 负载均衡策略枚举
     */
    enum LoadBalanceStrategy {
        /**
         * 轮询
         */
        ROUND_ROBIN,
        
        /**
         * 随机
         */
        RANDOM,
        
        /**
         * 权重轮询
         */
        WEIGHTED_ROUND_ROBIN,
        
        /**
         * 最少连接
         */
        LEAST_CONNECTIONS
    }
}
